import api
import config
import requests
import logging as logger
import pandas as pd
from utils import request

class RequestSheet(api.Sheet):
    def __init__(self):
        super().__init__(config.LARK_HOST,config.REQUEST_SHEET_TOKEN)
        self.access_token = self.get_tenant_access_token(config.APP_ID, config.APP_SECRET)
        

    def get_sheet_record(self,ranges:str):
        resp = super().get_sheet_record_single(self.access_token,ranges)
        return resp
    
    
    def put_sheet_record(self,data:list,ranges:str):
        resp = super().put_sheet_record_single(self.access_token,data,ranges)
        return resp
 
def fill_in_coa():
    print('开始填充COA')
    # 从Sheet对象获取推荐记录，resp是一个列表  
    ranges = "5BfdlX!D:L"
    resp = RequestSheet().get_sheet_record(ranges)
    
    # 使用推荐记录创建DataFrame，其中列名由resp[0]（列表中的第一个元素）提供  
    df = pd.DataFrame(resp[1:], columns=resp[0])  
    assert df.columns[-1] =='COA Available' , '列名不正确'
    # 从配置路径中读取test report.csv文件，并保存为df_coa DataFrame  
    df_coa = pd.read_csv(config.DATA_PATH+'\\test report.csv')  
    
    # 删除df_coa中'coa_link'列的缺失值  
    df_coa.dropna(subset='coa_link', axis=0, inplace=True)  
    
    # 遍历df的每一行  
    for i in range(df.shape[0]):  
        # 在df_coa中找到与当前行'Batch'值相匹配的行  
        df_batch = df_coa.loc[df_coa['batch'] == df.loc[i, 'Batch']]  
        
        # 在上一步的结果中找到与当前行'Pro Code'值相匹配的行  
        df_code = df_batch.loc[df_batch['code'] == df.loc[i, 'Pro Code']]  
        
        # 如果找到的行中'coa_link'列的值只有一个  
        coa_link = list(set(df_code['coa_link'].values))
        if len(coa_link) == 1:  
            # 将该值赋给当前行的'COA Available'列  
            df.loc[i, 'COA Available'] = coa_link[0]
        else:  
            # 否则，将'COA Available'列的值设置为'None'  
            df.loc[i, 'COA Available'] = 'None'  
    
    # 将处理后的DataFrame保存到新的CSV文件中，不包括索引列  
    df.to_csv(config.DATA_PATH+'\\request.csv', index=False)
    
    print('COA 填充完毕')
    return df

def update_request_coa():
    print('COA 更新开始')
    # 调用fill_in_coa()函数，更新COA数据（函数未给出）  
    fill_in_coa()  
    
    # 读取request.csv文件到DataFrame df中  
    df = pd.read_csv(config.DATA_PATH+'\\request.csv')  
        
    # 清空data列表，为后续的数据填充做准备  
    data = []  
    
    # 遍历DataFrame的每一行  
    for i in range(df.shape[0]):  
        # 如果COA Available列为'None'  
        if df.loc[i,'COA Available']=='None':  
            # 将'None'添加到data列表中  
            data.append(['None'])  
        else:  
            # 否则，创建一个包含COA信息的字典，并将其添加到data列表中  
            data.append([{'text':f'BKD - {df.loc[i,"Pro Code"]} {df.loc[i,"Batch"]} COA.pdf',  
                        'link':df.loc[i,"COA Available"],  
                        'type':"url"}])  
    
    # 计算每批更新的结束位置和剩余数量  
    end = len(data)  
    res = len(data) % 50  

    # 分批更新数据到Sheet工作表中（每批50条）  
    for i in range(len(data)//50):  
        resp = RequestSheet().put_sheet_record(data[i*50:(i+1)*50],f"5BfdlX!L{i*50+2}:L{(i+1)*50+1}")  
        print(resp)
    # 如果剩余数量大于0，则将剩余数据一次性更新到Sheet工作表中  
    if res > 0:  
        resp = RequestSheet().put_sheet_record(data[end-res:end+2],f"5BfdlX!L{end-res+2}:L{end+3}")
        print(resp)
    print('COA 更新完毕')
if __name__ == '__main__':
    update_request_coa()
    pass